﻿package com.eitb.plantillas{
	import flash.net.*;
	import flash.geom.*;
	import flash.utils.*;
	import flash.events.*;
	import flash.display.*;
	import com.eitb.factorias.*;
	import com.eitb.plantillas.*;
	import com.eitb.cargadores.*;
	import com.eitb.events.*;
	import com.eitb.net.*;
	import com.eitb.formaters.*;
	import com.eitb.events.ScrollEvent;
	import flash.utils.*;
	import flash.media.*;
	import flash.net.*;
	import com.eitb.imagenes.*;
	import com.eitb.literales.*;
	import com.eitb.nielsen.*;
	import com.eitb.rutas.*;
//	import com.eitb.programas.menu.utils.*;
	
	// TODO: Para mejorar esta clase lo correcto sería crear una subclase de Loader (ImageLoader?) donde se pueda sobre escribir el evento de ON_COMPLETE de forma que se añada un parametro identificador al tipo de foto cargada
	public class ModeloGaleria implements IControladorPlantilla,IControladorPlantillaGaleria,IControladorCargador {
		private var pantalla_x:int;
		private var pantalla_y:int;
		private var pantalla_w:int;
		private var pantalla_h:int;
		
		private static  const DESAPARECE_MIN_Y:int = 45;
		private static  const DESAPARECE_MAX_Y:int = 420;
		private static  const ICONO_WIDTH:int = 46;
		private static  const ICONO_HEIGHT:int = 34;
		private static  var ICONO_SCROLL_MIN_Y:int = DESAPARECE_MIN_Y;
		private static  var ICONO_SCROLL_MAX_Y:int = ICONO_SCROLL_MIN_Y;
		
		private var vPlantilla:IVistaPlantilla;
		private var vPlantillaGaleria:IVistaPlantillaGaleria;
		private var vPlantillaGaleriaTexto:IVistaPlantillaTexto;
		private var vCargador:IVistaCargador;

		private var nElementos:int;
		private var nElementosTotales:int;
		private var nImagen:int;
		private var iconos:Array;
		private var imagenes:Array;
		private var cargando:Boolean;
		
		private var idioma:int;
		private var literalesCargador:ILiterales;
		
		public function ModeloGaleria():void {
			this.iconos = new Array();
			this.cargando = false;
		}
		
		public function initVistaPlantilla(vPlantilla:IVistaPlantilla):void {
			this.vPlantilla = vPlantilla;
		}

		public function initVistaPlantillaGaleria(vPlantillaGaleria:IVistaPlantillaGaleria):void {
			this.vPlantillaGaleria = vPlantillaGaleria;
		}
		
		public function initVistaGaleriaTexto(v:IVistaPlantillaTexto):void {
			this.vPlantillaGaleriaTexto = v;
		}

		public function initVistaCargador(vCargador:IVistaCargador):void {
			this.vCargador = vCargador;
		}

		public function initTextos(textos:XMLList):void {
			 this.vPlantillaGaleriaTexto.setTextos(textos);
		}		
		
		public function initImagenes(imagenesXml:XMLList):void {
			for each (var imagen:XML in imagenesXml..imagen) {
				this.generarImagenIcono(imagen);
			}
			
			this.nElementosTotales = imagenesXml..imagen.length();

			ICONO_SCROLL_MAX_Y = ((this.nElementosTotales / 2) - 7) * 35;

			this.vPlantillaGaleria.setScrollVisible(this.nElementosTotales > 13);
			this.vPlantillaGaleria.setImagenesTotalesText(this.nElementosTotales.toString());
			this.iconos[0].dispatchEvent(new MouseEvent(MouseEvent.CLICK));
		}
		
		public function initIdioma(idioma:int):void {
			this.idioma = idioma;
		}
		
		public function initLiteralesCargador(literales:ILiterales):void {
			this.literalesCargador = literales;
			this.vCargador.setCargadorInfo(this.literalesCargador.getLiteral(CargadorLiterales.DESCARGANDO));
		}
			
		// GALERIA
		/**
		* Crea los Sprites donde se veran los iconos de las imageness
		*/
		private function generarImagenIcono(imagen:XML):void {
			var icono:GaleriaImagenIcono = new GaleriaImagenIcono();
//			var posicionY:Number = 85 + ((this.iconos.length / 2) * 35);
			var posicionY:Number = 85 +  new Number( ((-1 == this.iconos.length - 1 ? 0 : this.iconos.length - 1) / 2 ).toFixed(0) ) * 38;
			var posicionX:Number = 13 + this.iconos.length % 2 * 51;
			
			icono.x = posicionX;
			icono.y = posicionY;
			icono.setStartY(posicionY);
			icono.setRutaIcono(new Rutas().getRutaImagen(imagen.icono));
			icono.setRutaImagen(new Rutas().getRutaImagen(imagen.normal));
			icono.setEpigrafe(imagen.epigrafe);
			if (icono.y < ModeloGaleria.DESAPARECE_MAX_Y) {
				icono.visible = true;
			} else {
				icono.visible = false;
				icono.y = 0;
			}
			icono.addEventListener(MouseEvent.CLICK, clickIcono);
			this.iconos.push(icono);
			this.vPlantillaGaleria.addChildAt(icono, this.vPlantillaGaleria.getOcultadorIndex() - 1);
		}
		private function clickIcono(event:MouseEvent):void {
			var indice:int = this.iconos.indexOf(event.target);
			if (!this.iconos[indice].isImagen()) {
				this.loadImagenPantalla(indice);
			} else {
				this.vPlantillaGaleria.setPantalla(this.iconos[indice].getImagen());
			}
			this.vPlantillaGaleria.setImagenSeleccionadaText( (indice +1).toString());
			try {
				this.vPlantillaGaleriaTexto.setEpigrafe(this.iconos[indice].getEpigrafe());
			} catch (error:Error) {
				
			}
			
			new NielsenCall("galeria_".concat(this.iconos[indice].getRutaImagen().url)).doPing();
		}
		private function loadImagenPantalla(indice:int):void {
			var loader:Loader;

			loader=new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE,cargaPantallaComplete);
			loader.contentLoaderInfo.addEventListener(Event.OPEN,openHandler);			
			loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,cargaPantallaProgress);

			try {
				loader.load(this.iconos[indice].getRutaImagen());
			} catch (error:Error) {
				trace("Unable to load requested document.");
			}
		}
		private function cargaPantallaComplete(event:Event):void {
			var visorImagenes:Rectangle = new Rectangle(this.pantalla_x,this.pantalla_y,this.pantalla_w,this.pantalla_h);
			var rectangle:Rectangle;
			var loader:Loader=Loader(event.target.loader);
			var bitmap:Bitmap=Bitmap(loader.content);
			bitmap.cacheAsBitmap=true;
			
			rectangle = new ImagenAjuste().getImagenFit(new Point(bitmap.width, bitmap.height),visorImagenes);

			bitmap.width = rectangle.width;
			bitmap.height = rectangle.height;
			this.vPlantillaGaleria.setPantallaLocation(rectangle.topLeft);
			this.vPlantillaGaleria.setPantalla(bitmap);
			this.vPlantillaGaleria.setPantallaVisible(true);
		}
		private function cargaPantallaProgress(event:ProgressEvent):void {
			var porcentaje:Number = event.bytesLoaded / event.bytesTotal;
			this.vCargador.setCargadorProgress(porcentaje);
			this.vCargador.setCargadorContador(new PercentFormater(porcentaje).format(this.idioma));
			this.vCargador.setCargadorVisible(porcentaje != 1);
		}
		public function moveBotonScroll(event:ScrollEvent):void {
			for each (var icono:GaleriaImagenIcono in iconos) {
				icono.y = icono.getStartY() + ((event.porcentaje) * (ICONO_SCROLL_MIN_Y - ICONO_SCROLL_MAX_Y));
				icono.visible = icono.y < ModeloGaleria.DESAPARECE_MAX_Y && icono.y > ModeloGaleria.DESAPARECE_MIN_Y;
			}
		}
		// GALERIA
		// CARGADOR
		public function addElementos(numero:int):void {
			this.nElementos += numero;
		}
		public function removeElementos(numero:int):void {
			this.nElementos -= numero;
		}
		private function setCargadorInfo(porcentaje:Number):void {
			this.vCargador.setCargadorContador(new PercentFormater(porcentaje).format(this.idioma));	
			this.vCargador.setCargadorProgress(porcentaje);			
			this.vCargador.setCargadorVisible(porcentaje != 1);
		}				
		// CARGADOR
		// CARGAR IMAGENES
		public function loadImagenes():void {
			var loader:Loader;

			for each (var icono in this.iconos) {
				if (!icono.isIcono() && !this.cargando) {
					this.cargando = true;
					loader=new Loader();

					this.configureListeners(loader.contentLoaderInfo);
					try {
						loader.load(icono.getRutaIcono());
					} catch (error:Error) {
						trace("Unable to load requested document.");
					}
				}
			}
		}
		private function completeHandler(event:Event):void {
			var loader:Loader=Loader(event.target.loader);
			var bitmap:Bitmap=Bitmap(loader.content);

			bitmap.width = ModeloGaleria.ICONO_WIDTH;
			bitmap.height = ModeloGaleria.ICONO_HEIGHT;

			for each (var icono in this.iconos) {
				if (!icono.isIcono()) {
					icono.setIcono(bitmap);
					icono.addChild(bitmap);
					this.cargando = false;
					this.loadImagenes();
					break;
				}
			}
			this.nImagen += 1;
			this.addElementos(1);

			this.setCargadorInfo(this.nElementos / this.nElementosTotales);
		}
		
		private function openHandler(event:Event):void {
			this.setCargadorInfo(0);
		}
		
		private function progressHandler(event:ProgressEvent):void {
			this.setCargadorInfo(event.bytesLoaded / event.bytesTotal);
		}

    	private function ioErrorHandler(event:IOErrorEvent):void {
			this.nImagen += 1;
			this.addElementos(1);
			this.loadImagenes();
        }			
		
		private function configureListeners(dispatcher:IEventDispatcher):void {
			dispatcher.addEventListener(Event.COMPLETE,completeHandler);
			dispatcher.addEventListener(ProgressEvent.PROGRESS,progressHandler);

            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
		}
		public function setCoord(p_x:int,p_y:int,p_w:int,p_h:int):void {
			this.pantalla_x = p_x;
			this.pantalla_y = p_y;
			this.pantalla_w = p_w;
			this.pantalla_h = p_h;
		}
		// CARGAR IMAGENES
	}
}